/*
 * exame_11 Jun_2011_exIII_muti-oc
 *
 *  Created on: Jun 8, 2012
 *      Author: ubuntu
 */

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>

int main(int argc, char **argv) {

	if (argc < 3) {
		fprintf(stderr, "Usage: %s termo_a_pesquisar [ficheiros] \n", argv[0]);
		exit(EXIT_FAILURE);
	}

//	char palavra_a_pesquisar[] = argv[1];
	char * palavra_a_pesquisar = argv[1];

	int numeroFicheiros = argc - 2;
	//int * ficheiros;

	//percorrer nomes dos ficheiros
	//ficheiros = (int *) malloc(sizeof(int) * (numeroFicheiros));

	int i = 0;
	int* pipes[numeroFicheiros];
	int resultados[numeroFicheiros];
	for (i = 0; i < numeroFicheiros; i++) {

		//int fdreceive[2];
		int * fdreceive = (int *) malloc(sizeof(int) * 2);

		pipe(fdreceive);

		pipes[i] = fdreceive;

	}

	for (i = 0; i < numeroFicheiros; i++) {

		pid_t pid = fork();

		if (pid == 0) { //se é filho
			int fd = open(argv[2 + i], O_RDONLY);
			if (fd == -1) {
				perror("open");
				exit(EXIT_FAILURE);
			}

			close(pipes[i][0]);
			dup2(fd, STDIN_FILENO);
			dup2(pipes[i][1], STDOUT_FILENO);

			execl("oc.exe", "oc.exe", palavra_a_pesquisar, NULL);
			perror("execl");
			exit(EXIT_FAILURE);

		} else {
			close(pipes[i][1]);
		}

	}

	int j = 0;
	for (j = 0; j < numeroFicheiros; j++) {
		char buffer[100];

		//read bloqueia automaticamente um fd aberto.
		read(pipes[j][0], buffer, 100);
		//dup2(pipes[i][0], fp); //aqui devia enviar para um buffer
		int resultado = atoi(buffer);
		//	close(fp);
		//	wait(NULL);
		resultados[j] = resultado;
	}

	for (i = 0; i < numeroFicheiros; i++) {

		printf("%s: %d ", argv[i + 2], resultados[i]);

	}

	printf("\n");

	return 0;
}
